package entity

import (
	"github.com/gogf/gf/v2/os/gtime"
)

// User 用户实体
type User struct {
	Id          int         `json:"id" dc:"ID"`
	Username    string      `json:"username" dc:"用户名"`
	Password    string      `json:"-" dc:"密码"` // 不返回密码
	Email       string      `json:"email" dc:"邮箱"`
	Phone       string      `json:"phone" dc:"手机号"`
	Nickname    string      `json:"nickname" dc:"昵称"`
	Avatar      string      `json:"avatar" dc:"头像"`
	Role        string      `json:"role" dc:"角色"`
	Status      string      `json:"status" dc:"状态"`
	LastLoginAt *gtime.Time `json:"last_login_at" dc:"最后登录时间"`
	LastLoginIp string      `json:"last_login_ip" dc:"最后登录IP"`
	LoginCount  int         `json:"login_count" dc:"登录次数"`
	CreatedAt   *gtime.Time `json:"created_at" dc:"创建时间"`
	UpdatedAt   *gtime.Time `json:"updated_at" dc:"更新时间"`
}

// UserToken 用户令牌实体
type UserToken struct {
	Id        int         `json:"id" dc:"ID"`
	UserId    int         `json:"user_id" dc:"用户ID"`
	Token     string      `json:"token" dc:"令牌"`
	TokenType string      `json:"token_type" dc:"令牌类型"`
	ExpiresAt *gtime.Time `json:"expires_at" dc:"过期时间"`
	IsRevoked bool        `json:"is_revoked" dc:"是否已撤销"`
	CreatedAt *gtime.Time `json:"created_at" dc:"创建时间"`
}

// Stock 股票实体
type Stock struct {
	Id          int         `json:"id" dc:"ID"`
	Code        string      `json:"code" dc:"股票代码"`
	Name        string      `json:"name" dc:"股票名称"`
	Market      string      `json:"market" dc:"市场代码(SH/SZ/BJ)"`
	Industry    string      `json:"industry" dc:"行业"`
	Sector      string      `json:"sector" dc:"板块"`
	MarketCap   float64     `json:"market_cap" dc:"市值"`
	PeRatio     float64     `json:"pe_ratio" dc:"市盈率"`
	PbRatio     float64     `json:"pb_ratio" dc:"市净率"`
	ListingDate *gtime.Time `json:"listing_date" dc:"上市日期"`
	IsActive    bool        `json:"is_active" dc:"是否有效"`
	CreatedAt   *gtime.Time `json:"created_at" dc:"创建时间"`
	UpdatedAt   *gtime.Time `json:"updated_at" dc:"更新时间"`
}

// StockPool 股票池实体
type StockPool struct {
	Id          int         `json:"id" dc:"ID"`
	Name        string      `json:"name" dc:"股票池名称"`
	Description string      `json:"description" dc:"描述"`
	Type        string      `json:"type" dc:"类型(static/dynamic)"`
	MaxSize     int         `json:"max_size" dc:"最大股票数量"`
	IsActive    bool        `json:"is_active" dc:"是否有效"`
	CreatedAt   *gtime.Time `json:"created_at" dc:"创建时间"`
	UpdatedAt   *gtime.Time `json:"updated_at" dc:"更新时间"`
}

// StockPoolMember 股票池成员实体
type StockPoolMember struct {
	Id        int         `json:"id" dc:"ID"`
	PoolId    int         `json:"pool_id" dc:"股票池ID"`
	StockCode string      `json:"stock_code" dc:"股票代码"`
	StockName string      `json:"stock_name" dc:"股票名称"`
	Weight    float64     `json:"weight" dc:"权重"`
	AddedAt   *gtime.Time `json:"added_at" dc:"添加时间"`
}

// StockPoolRule 股票池规则实体
type StockPoolRule struct {
	Id            int         `json:"id" dc:"ID"`
	PoolId        int         `json:"pool_id" dc:"股票池ID"`
	RuleName      string      `json:"rule_name" dc:"规则名称"`
	RuleType      string      `json:"rule_type" dc:"规则类型"`
	RuleCondition string      `json:"rule_condition" dc:"规则条件(JSON)"`
	Priority      int         `json:"priority" dc:"优先级"`
	IsActive      bool        `json:"is_active" dc:"是否有效"`
	CreatedAt     *gtime.Time `json:"created_at" dc:"创建时间"`
	UpdatedAt     *gtime.Time `json:"updated_at" dc:"更新时间"`
}

// Tag 标签实体
type Tag struct {
	Id          int         `json:"id" dc:"ID"`
	Name        string      `json:"name" dc:"标签名称"`
	Category    string      `json:"category" dc:"标签分类"`
	ParentId    *int        `json:"parent_id" dc:"父标签ID"`
	Color       string      `json:"color" dc:"标签颜色"`
	Description string      `json:"description" dc:"描述"`
	SortOrder   int         `json:"sort_order" dc:"排序"`
	IsActive    bool        `json:"is_active" dc:"是否有效"`
	CreatedAt   *gtime.Time `json:"created_at" dc:"创建时间"`
	UpdatedAt   *gtime.Time `json:"updated_at" dc:"更新时间"`
}

// StockTag 股票标签关联实体
type StockTag struct {
	Id         int         `json:"id" dc:"ID"`
	StockCode  string      `json:"stock_code" dc:"股票代码"`
	TagId      int         `json:"tag_id" dc:"标签ID"`
	Weight     float64     `json:"weight" dc:"权重"`
	AssignedAt *gtime.Time `json:"assigned_at" dc:"分配时间"`
	AssignedBy string      `json:"assigned_by" dc:"分配人"`
}

// SystemConfig 系统配置实体
type SystemConfig struct {
	Id          int         `json:"id" dc:"ID"`
	ConfigKey   string      `json:"config_key" dc:"配置键"`
	ConfigValue string      `json:"config_value" dc:"配置值"`
	ConfigType  string      `json:"config_type" dc:"配置类型"`
	Description string      `json:"description" dc:"描述"`
	IsActive    bool        `json:"is_active" dc:"是否有效"`
	CreatedAt   *gtime.Time `json:"created_at" dc:"创建时间"`
	UpdatedAt   *gtime.Time `json:"updated_at" dc:"更新时间"`
}

// SystemLog 系统日志实体
type SystemLog struct {
	Id        int         `json:"id" dc:"ID"`
	Level     string      `json:"level" dc:"日志级别"`
	Module    string      `json:"module" dc:"模块"`
	Message   string      `json:"message" dc:"消息"`
	Context   string      `json:"context" dc:"上下文"`
	IpAddress string      `json:"ip_address" dc:"IP地址"`
	UserAgent string      `json:"user_agent" dc:"用户代理"`
	CreatedAt *gtime.Time `json:"created_at" dc:"创建时间"`
}

// Strategy 策略实体
type Strategy struct {
	Id          int         `json:"id" dc:"ID"`
	Name        string      `json:"name" dc:"策略名称"`
	Type        string      `json:"type" dc:"策略类型"`
	Description string      `json:"description" dc:"描述"`
	Parameters  string      `json:"parameters" dc:"参数(JSON)"`
	StockPool   string      `json:"stock_pool" dc:"股票池(JSON)"`
	IsActive    bool        `json:"is_active" dc:"是否激活"`
	Status      string      `json:"status" dc:"状态"`
	StartTime   *gtime.Time `json:"start_time" dc:"开始时间"`
	StopTime    *gtime.Time `json:"stop_time" dc:"停止时间"`
	RunCount    int         `json:"run_count" dc:"运行次数"`
	ErrorCount  int         `json:"error_count" dc:"错误次数"`
	LastError   string      `json:"last_error" dc:"最后错误"`
	CreatedAt   *gtime.Time `json:"created_at" dc:"创建时间"`
	UpdatedAt   *gtime.Time `json:"updated_at" dc:"更新时间"`
}

// StrategyLog 策略日志实体
type StrategyLog struct {
	Id         int         `json:"id" dc:"ID"`
	StrategyId int         `json:"strategy_id" dc:"策略ID"`
	Level      string      `json:"level" dc:"日志级别"`
	Message    string      `json:"message" dc:"消息"`
	Context    string      `json:"context" dc:"上下文"`
	CreatedAt  *gtime.Time `json:"created_at" dc:"创建时间"`
}

// TradingSignal 交易信号实体
type TradingSignal struct {
	Id         int         `json:"id" dc:"ID"`
	StrategyId int         `json:"strategy_id" dc:"策略ID"`
	StockCode  string      `json:"stock_code" dc:"股票代码"`
	SignalType string      `json:"signal_type" dc:"信号类型"`
	Price      float64     `json:"price" dc:"价格"`
	Quantity   int         `json:"quantity" dc:"数量"`
	Confidence float64     `json:"confidence" dc:"置信度"`
	Reason     string      `json:"reason" dc:"原因"`
	ExtraData  string      `json:"extra_data" dc:"额外数据(JSON)"`
	Status     string      `json:"status" dc:"状态"`
	ExecutedAt *gtime.Time `json:"executed_at" dc:"执行时间"`
	CreatedAt  *gtime.Time `json:"created_at" dc:"创建时间"`
}

// StrategyPerformance 策略性能实体
type StrategyPerformanceEntity struct {
	Id           int         `json:"id" dc:"ID"`
	StrategyId   int         `json:"strategy_id" dc:"策略ID"`
	TotalReturn  float64     `json:"total_return" dc:"总收益率"`
	AnnualReturn float64     `json:"annual_return" dc:"年化收益率"`
	SharpeRatio  float64     `json:"sharpe_ratio" dc:"夏普比率"`
	MaxDrawdown  float64     `json:"max_drawdown" dc:"最大回撤"`
	WinRate      float64     `json:"win_rate" dc:"胜率"`
	TotalTrades  int         `json:"total_trades" dc:"总交易次数"`
	WinTrades    int         `json:"win_trades" dc:"盈利交易次数"`
	LoseTrades   int         `json:"lose_trades" dc:"亏损交易次数"`
	AverageWin   float64     `json:"average_win" dc:"平均盈利"`
	AverageLoss  float64     `json:"average_loss" dc:"平均亏损"`
	ProfitFactor float64     `json:"profit_factor" dc:"盈亏比"`
	UpdatedAt    *gtime.Time `json:"updated_at" dc:"更新时间"`
}

// StrategyPosition 策略持仓实体
type StrategyPosition struct {
	Id           int         `json:"id" dc:"ID"`
	StrategyId   int         `json:"strategy_id" dc:"策略ID"`
	StockCode    string      `json:"stock_code" dc:"股票代码"`
	Quantity     int         `json:"quantity" dc:"数量"`
	AvgPrice     float64     `json:"avg_price" dc:"平均成本"`
	CurrentPrice float64     `json:"current_price" dc:"当前价格"`
	MarketValue  float64     `json:"market_value" dc:"市值"`
	PnL          float64     `json:"pnl" dc:"盈亏"`
	PnLRatio     float64     `json:"pnl_ratio" dc:"盈亏比例"`
	OpenTime     *gtime.Time `json:"open_time" dc:"开仓时间"`
	LastUpdate   *gtime.Time `json:"last_update" dc:"最后更新"`
}